// 华为技术面 真题
// function compare( str1, str2 )
// 17进制 -> 顺序和16进制不同，依次为：0、A、1、2、3、4、5、6、7、8、9、B、C、D、E、F、G
// 数字对大小写不敏感
// 如果某个字符前带有有0000的前缀，需要手动处理，比如"000000A"->"A"
// 不能使用JS中原生的进制转换功能

// 本题有一个要点，我做题的时候疏忽了，导致逻辑没写对。
// 这两个数不是进行字符串大小比较，而是以字符串形式的数字比较大小
// 比如：str1="G" str2="AB"
// 这两个数，实际应该是AB>G，因为AB的10进制是28，G的10进制是16。但若是字符串比大小，是str1大，应为G>A。
// 下面有一个strToNum是用来做17进制转10进制的

let compareRule = {
    0: 0,
    1: 2,
    2: 3,
    3: 4,
    4: 5,
    5: 6,
    6: 7,
    7: 8,
    8: 9,
    9: 10,
    a: 1,
    b: 11,
    c: 12,
    d: 13,
    e: 14,
    f: 15,
    g: 16,
};

function compare(str1, str2) {
    let res = 0;
    const num1 = strToNum(str1);
    const num2 = strToNum(str2);

    console.log(
        `1.[convert] ${str1}->${num1} ${str2}->${num2} is ${
            num1 < num2 ? -1 : num1 > num2 ? 1 : 0
        }`
    );

    const lowStr1 = str1.toLowerCase();
    const lowStr2 = str2.toLowerCase();

    const arrStr1 = filterZero(lowStr1.split(''));
    const arrStr2 = filterZero(lowStr2.split(''));

    if (arrStr1.length > arrStr2.length) {
        console.log(`2.[result] ${str1} ${str2} is 1`);
        return 1;
    } else if (arrStr1.length < arrStr2.length) {
        console.log(`2.[result] ${str1} ${str2} is -1`);
        return -1;
    } else {
        // let maxLen = Math.max(arrStr1.length, arrStr2.length);
        for (let i = 0; i < arrStr1.length; i++) {
            let eleStr1 = arrStr1[i];
            let eleStr2 = arrStr2[i];

            res = compareChar(eleStr1, eleStr2);

            if (res != 0) {
                break;
            }
        }
    }

    console.log(`2.[result] ${str1} ${str2} is ${res}`);
    return res;
}

function strToNum(strNum) {
    strNum = strNum.toLowerCase();
    let numRes = 0;
    for (let i = strNum.length - 1; i >= 0; i--) {
        let base = 17 ** (strNum.length - 1 - i);
        numRes += compareRule[strNum[i]] * base;
    }

    // console.log(`${strNum} is ${numRes}`);
    return numRes;
}

function compareChar(charA, charB) {
    if (charA === undefined && charB === undefined) return 0;
    if (charA == undefined) return -1;
    if (charB == undefined) return 1;

    return compareRule[charA] < compareRule[charB]
        ? -1
        : compareRule[charA] > compareRule[charB]
        ? 1
        : 0;
}

function filterZero(arr) {
    while (arr[0] === '0') {
        arr.shift();
    }

    return arr;
}

compare('0A', 'a'); // 0
compare('0000A', 'a'); // 0
compare('A', '1'); // -1
compare('A1', 'A0'); // 1
compare('A1', 'A'); // 1
compare('A', 'A1'); // -1
compare('GFEDCBA', '1'); // 1
compare('GA', 'G1'); // -1
compare('AAA', 'AAB'); // -1
compare('0', '1'); // -1
compare('AB', 'Z'); // 1

// ['0A', 'a', '0000A', '0', 'AB', 'G', 'Z'].forEach(strToNum);
